package com.xb.loan.util.common;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 类之间操作工具类
 *
 */
public class ObjectOperation {
	/**
	 * 将t转换成clazz实例，要求t的属性值要在clazz中存在(名称、类型)，clazz必须要有默认构造方法
	 * @param t 被转换的实例对象
	 * @param clazz 要转换而成的类型
	 * @return 转换成功则生成clazz实例List，失败则为null
	 */
	public static <T> List<T> convertByClassesList(List<? extends Object> t,Class<T> clazz){
	    if(t == null ){
	        return null;
	    }
		List<T> list = new ArrayList<T>();
		for (Object object : t) {
			list.add(convertByClasses(object, clazz));
		}
		return list;
	}
	/**
	 * 将t转换成clazz实例，要求t的属性值要在clazz中存在(名称、类型)，clazz必须要有默认构造方法
	 * @param t 被转换的实例对象
	 * @param clazz 要转换而成的类型
	 * @return 转换成功则生成clazz实例，失败则为null
	 */
	public static <T> T convertByClasses(Object t,Class<T> clazz) {
		if(t == null){
			return null;
		}
		//得到类对象  
		Class<? extends Object> userCla = t.getClass();  
		T obj = null;
		try{
			obj = clazz.newInstance();
			Field[] fs = userCla.getDeclaredFields();
			List<Field> fsAll = new ArrayList<Field>();
			if(userCla.getSuperclass() != null){
				Field[] fsParent = userCla.getSuperclass().getDeclaredFields();
				for (Field field : fsParent) {
					fsAll.add(field);
				}
			}
			if(fsAll.size() > 0){
				for (Field field : fs) {
					fsAll.add(field);
				}
				fs = fsAll.toArray(fs);
			}
			
	        Field fObj = null;
	        
	        Field[] fsClazz = clazz.getDeclaredFields();
	        List<Field> fsClazzAll = new ArrayList<Field>();
	        if(clazz.getSuperclass() != null){
	        	for (Field field : clazz.getSuperclass().getDeclaredFields()) {
	        		fsClazzAll.add(field);
				}
	        }
	        if(fsClazzAll.size() > 0){
	        	for (Field field : fsClazz) {
		        	fsClazzAll.add(field);
				}
	        	fsClazz = fsClazzAll.toArray(fsClazz);
	        }
	        
	        Map<String,Field> map = new HashMap<String,Field>();
	        for (Field field : fsClazz) {
	        	map.put(field.getName(), field);
			}
	        for(int i = 0 ; i < fs.length; i++){  
	           Field f = fs[i];  
	           f.setAccessible(true); //设置些属性是可以访问的  
	           Object val = f.get(t);//得到此属性的值     
	           // System.out.println("name:"+f.getName()+"\t value = "+val); 
	           fObj = map.get(f.getName());
	           if(fObj != null && fObj.getType().equals(f.getType()) && !Modifier.isFinal(fObj.getModifiers())){
	        	   fObj.setAccessible(true);
	        	   fObj.set(obj, val); 
	           }
	           fObj = null;
	        }  
		}catch(Exception e){
			e.printStackTrace();
			throw new RuntimeException(e.getMessage(), e);
		}
		return obj;
	}
	/**
	 * 
	 * 数组为空或者数组中有一个元素为""或者null 则返回true
	 * @param str
	 * @return
	 * 2015年9月8日 by zhangyi
	 */
	public static boolean verifyStringArrayEmpty(String[] str){
		if(str != null && str.length > 0){
			for (String string : str) {
				if(org.apache.commons.lang3.StringUtils.isEmpty(string)){
					return true;
				}
			}
		}else{
			return true;
		}
		return false;
	}
	/**
	 * 
	 * 数组为空或者数组中有一个元素为""或者null或者" " 则返回true
	 * @param str
	 * @return
	 * 2015年9月8日 by zhangyi
	 */
	public static boolean verifyStringArrayBlank(String[] str){
		if(str != null && str.length > 0){
			for (String string : str) {
				if(org.apache.commons.lang3.StringUtils.isBlank(string)){
					return true;
				}
			}
		}else{
			return true;
		}
		return false;
	}
}
